/**
 * JWT 时间工具类
 * 
 * 用于解析 JWT 过期时间配置（如 '7d', '1h', '30m'）为秒数
 */
export class JwtTimeUtil {
  /**
   * 将时间字符串转换为秒数
   * 
   * 支持的格式：
   * - 数字（秒）：3600
   * - 秒：'60s', '60'
   * - 分钟：'30m'
   * - 小时：'1h'
   * - 天：'7d'
   * 
   * @param time 时间字符串或数字
   * @returns 秒数
   * 
   * @example
   * ```ts
   * JwtTimeUtil.toSeconds('7d')   // 604800
   * JwtTimeUtil.toSeconds('1h')   // 3600
   * JwtTimeUtil.toSeconds('30m')  // 1800
   * JwtTimeUtil.toSeconds('60s')  // 60
   * JwtTimeUtil.toSeconds(3600)   // 3600
   * ```
   */
  static toSeconds(time: string | number): number {
    // 如果是数字，直接返回
    if (typeof time === 'number') {
      return time;
    }

    // 去除空格
    const trimmed = time.trim();

    // 匹配数字和单位
    const match = trimmed.match(/^(\d+)([smhd])?$/);
    if (!match) {
      throw new Error(`无效的时间格式: ${time}，支持格式：60s, 30m, 1h, 7d`);
    }

    const value = parseInt(match[1], 10);
    const unit = match[2] || 's'; // 默认单位为秒

    switch (unit) {
      case 's': // 秒
        return value;
      case 'm': // 分钟
        return value * 60;
      case 'h': // 小时
        return value * 60 * 60;
      case 'd': // 天
        return value * 24 * 60 * 60;
      default:
        throw new Error(`不支持的时间单位: ${unit}`);
    }
  }

  /**
   * 将秒数转换为可读的时间字符串
   * 
   * @param seconds 秒数
   * @returns 时间字符串
   * 
   * @example
   * ```ts
   * JwtTimeUtil.fromSeconds(604800)  // '7d'
   * JwtTimeUtil.fromSeconds(3600)    // '1h'
   * JwtTimeUtil.fromSeconds(1800)    // '30m'
   * JwtTimeUtil.fromSeconds(60)      // '60s'
   * ```
   */
  static fromSeconds(seconds: number): string {
    if (seconds % (24 * 60 * 60) === 0) {
      return `${seconds / (24 * 60 * 60)}d`;
    }
    if (seconds % (60 * 60) === 0) {
      return `${seconds / (60 * 60)}h`;
    }
    if (seconds % 60 === 0) {
      return `${seconds / 60}m`;
    }
    return `${seconds}s`;
  }
}

